A process running on a computer may have multiple threads running concurrently. Different threads may have different purposes, different priorities, may request resources at different frequencies, and may access different amounts of resources. Managing the available resources to provide the requested resources may be performed a number of different ways, such as allowing each thread to obtain as much of the resources it needs on a first-requested basis. The end result may be that the threads first requesting resources exhaust the resources before subsequent requesting threads get a share. Another strategy is to partition available resources into separate pools, and allow each thread to take resources only from its respective pool. This strategy ensures that each thread receives some resources, but some threads may not receive enough of their required resources, while other threads aren't utilizing all of the resources allocated in their respective pools.